home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / system-config-printer / PhysicalDevice.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  7KB  |  225 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from gettext import gettext as _
  5. import cupshelpers
  6. import urllib
  7. import re
  8. import subprocess
  9.  
  10. class PhysicalDevice:
  11.     
  12.     def __init__(self, device):
  13.         self.devices = None
  14.         self._network_host = None
  15.         self.add_device(device)
  16.         self._user_data = { }
  17.  
  18.     
  19.     def _canonical_id(self, device):
  20.         if device.id_dict:
  21.             mfg = device.id_dict.get('MFG', '')
  22.             mdl = device.id_dict.get('MDL', '')
  23.         
  24.         if mfg == '' or mdl.lower().startswith(mfg.lower()):
  25.             make_and_model = mdl
  26.         else:
  27.             make_and_model = '%s %s' % (mfg, mdl)
  28.         return cupshelpers.ppds.ppdMakeModelSplit(make_and_model)
  29.  
  30.     
  31.     def _get_host_from_uri(self, uri):
  32.         
  33.         def expandpercent(searchres):
  34.             expr = searchres.group(0)
  35.             return chr(int(expr[1:], 16))
  36.  
  37.         (scheme, rest) = urllib.splittype(uri)
  38.         if scheme == 'hp' or scheme == 'hpfax':
  39.             if rest.startswith('/net/'):
  40.                 (rest, ipparam) = urllib.splitquery(rest[5:])
  41.                 if ipparam != None and ipparam.startswith('ip='):
  42.                     hostport = ipparam[3:]
  43.                 else:
  44.                     return None
  45.             ipparam.startswith('ip=')
  46.         elif scheme == 'dnssd' or scheme == 'mdns':
  47.             (hostport, rest) = urllib.splithost(rest)
  48.             p = hostport.find('.')
  49.             if p != -1:
  50.                 hostport = hostport[:p]
  51.             
  52.             if hostport == '':
  53.                 return None
  54.             hostport = hostport.encode('utf-8')
  55.             hostport = re.sub('%(?i)[\\dabcdef]{2}', expandpercent, hostport)
  56.             if not uri.endswith('/cups'):
  57.                 for mode in ('-c', '-t'):
  58.                     cmd = ('avahi-browse -a -r %s -k 2>/dev/null | ' + "grep -A4 '^=' | grep -F -A4 '%s' | " + 'grep address | head -1 | ' + "cut -d '[' -f 2 | cut -d ']' -f 1") % (mode, hostport)
  59.                     
  60.                     try:
  61.                         p = subprocess.Popen(cmd, shell = True, stdin = file('/dev/null'), stdout = subprocess.PIPE, stderr = subprocess.PIPE)
  62.                         (stdout, stderr) = p.communicate()
  63.                         if p.returncode == 0:
  64.                             ip = stdout.strip()
  65.                             if ip != '':
  66.                                 hostport = ip
  67.                                 break
  68.                             
  69.                     continue
  70.                     continue
  71.  
  72.                 
  73.             
  74.         else:
  75.             (hostport, rest) = urllib.splithost(rest)
  76.             if hostport == None:
  77.                 return None
  78.         (host, port) = urllib.splitport(hostport)
  79.         return host
  80.  
  81.     
  82.     def add_device(self, device):
  83.         if self._network_host:
  84.             host = self._get_host_from_uri(device.uri)
  85.             if host != self._network_host:
  86.                 raise ValueError
  87.             host != self._network_host
  88.         else:
  89.             (mfg, mdl) = self._canonical_id(device)
  90.             if self.devices == None:
  91.                 self.mfg = mfg
  92.                 self.mdl = mdl
  93.                 self.mfg_lower = mfg.lower()
  94.                 self.mdl_lower = mdl.lower()
  95.                 self.sn = device.id_dict.get('SN', '')
  96.                 self.devices = []
  97.             else:
  98.                 
  99.                 def nicest(a, b):
  100.                     
  101.                     def count_lower(s):
  102.                         l = s.lower()
  103.                         n = 0
  104.                         for i in xrange(len(s)):
  105.                             if l[i] != s[i]:
  106.                                 n += 1
  107.                                 continue
  108.                         
  109.                         return n
  110.  
  111.                     if count_lower(b) < count_lower(a):
  112.                         return b
  113.                     return a
  114.  
  115.                 self.mfg = nicest(self.mfg, mfg)
  116.                 self.mdl = nicest(self.mdl, mdl)
  117.                 sn = device.id_dict.get('SN', '')
  118.                 if sn != '' and self.sn != '' and sn != self.sn:
  119.                     raise ValueError
  120.                 sn != self.sn
  121.         for d in self.devices:
  122.             if d.uri == device.uri:
  123.                 return None
  124.         
  125.         self.devices.append(device)
  126.         self.devices.sort()
  127.         if not (self._network_host) and device.device_class == 'network':
  128.             self._network_host = self._get_host_from_uri(device.uri)
  129.         
  130.  
  131.     
  132.     def get_devices(self):
  133.         return self.devices
  134.  
  135.     
  136.     def get_info(self):
  137.         if not self.mfg == '':
  138.             if not self.mfg == 'HP' or self.mdl == 'Fax':
  139.                 if (self.devices[0].uri.startswith('dnssd:') or self.devices[0].uri.startswith('mdns:')) and self.devices[0].uri.endswith('/cups'):
  140.                     info = self.devices[0].info
  141.                 else:
  142.                     info = '%s %s' % (self.mfg, self.mdl)
  143.         if len(self.sn) > 0:
  144.             info += ' (%s)' % self.sn
  145.         elif self._network_host and len(self._network_host) > 0:
  146.             if self.devices[0].uri.startswith('dnssd:') or self.devices[0].uri.startswith('mdns:'):
  147.                 pass
  148.             if not self.devices[0].uri.endswith('/cups'):
  149.                 info += ' (%s)' % self._network_host
  150.             
  151.         return info
  152.  
  153.     
  154.     def set_data(self, key, value):
  155.         self._user_data[key] = value
  156.  
  157.     
  158.     def get_data(self, key):
  159.         return self._user_data.get(key)
  160.  
  161.     
  162.     def __str__(self):
  163.         return '(description: %s)' % self.__repr__()
  164.  
  165.     
  166.     def __repr__(self):
  167.         return '<PhysicalDevice.PhysicalDevice (%s,%s,%s)>' % (self.mfg, self.mdl, self.sn)
  168.  
  169.     
  170.     def __cmp__(self, other):
  171.         if other == None or type(other) != type(self):
  172.             return 1
  173.         if self._network_host != None or other._network_host != None:
  174.             return cmp(self._network_host, other._network_host)
  175.         if (other.mfg == '' or other.mdl == '' or self.mfg == '') and self.mdl == '':
  176.             if other.mfg == '' and other.mdl == '' and self.mfg == '' and self.mdl == '':
  177.                 return cmp(self.devices[0], other.devices[0])
  178.             if other.mfg == '' and other.mdl == '':
  179.                 return -1
  180.             return 1
  181.         (our_mfg, our_mdl) = cupshelpers.ppds.ppdMakeModelSplit(our_make_and_model)
  182.         if other.mfg == '' or other.mdl.lower().startswith(other.mfg.lower()):
  183.             other_make_and_model = other.mdl
  184.         else:
  185.             other_make_and_model = '%s %s' % (other.mfg, other.mdl)
  186.         (other_mfg, other_mdl) = cupshelpers.ppds.ppdMakeModelSplit(other_make_and_model)
  187.         mfgcmp = cmp(our_mfg.lower(), other_mfg.lower())
  188.         if mfgcmp != 0:
  189.             return mfgcmp
  190.         mdlcmp = cmp(our_mdl.lower(), other_mdl.lower())
  191.         if mdlcmp != 0:
  192.             return mdlcmp
  193.         if self.sn == '' or other.sn == '':
  194.             return 0
  195.         return cmp(self.sn, other.sn)
  196.  
  197.  
  198. if __name__ == '__main__':
  199.     import authconn
  200.     c = authconn.Connection()
  201.     devices = cupshelpers.getDevices(c)
  202.     physicaldevices = []
  203.     for device in devices.values():
  204.         physicaldevice = PhysicalDevice(device)
  205.         
  206.         try:
  207.             i = physicaldevices.index(physicaldevice)
  208.             physicaldevices[i].add_device(device)
  209.         continue
  210.         except ValueError:
  211.             physicaldevices.append(physicaldevice)
  212.             continue
  213.         
  214.  
  215.     
  216.     physicaldevices.sort()
  217.     for physicaldevice in physicaldevices:
  218.         print physicaldevice.get_info()
  219.         devices = physicaldevice.get_devices()
  220.         for device in devices:
  221.             print ' ', device
  222.         
  223.     
  224.  
  225.